#include <linux/module.h>
#include <linux/sched.h>
#include <linux/sched/signal.h>
#include <linux/kernel.h>
#include <linux/init.h>

MODULE_LICENSE("GPL");

struct task_struct *p;  // 定义指向进程结构体的指针

// 初始化函数，遍历所有进程
static int __init process_info_init(void)
{
    printk(KERN_ALERT "Start process_info!\n");

    // 遍历所有进程
    for_each_process(p) {
        // 过滤掉僵尸进程，使用 EXIT_ZOMBIE 替代 TASK_ZOMBIE
        if (p->state != EXIT_ZOMBIE) {  // 排除僵尸进程
            // 打印进程信息：进程名、PID 和状态
            printk(KERN_ALERT "1) name: %s 2) pid: %d 3) state: %ld\n",
                   p->comm, p->pid, p->state);
        }
    }
    return 0;
}

// 卸载函数，模块退出时调用
static void __exit process_info_exit(void)
{
    printk(KERN_ALERT "Exit process_info!\n");
}

module_init(process_info_init);   // 加载时调用 process_info_init
module_exit(process_info_exit);   // 卸载时调用 process_info_exit
